#pragma once

class Player;
class AbstractLevel
{
    friend class Player;

public:
    virtual ~AbstractLevel() = default;

protected:
    virtual void play(Player *player);
    virtual void doubleScore(Player *player);
    virtual void changeCards(Player *player);
    virtual void cardWriting(Player *player);
};

/**
 * @brief 入门级
 *
 */
class PrimaryLevel : public AbstractLevel
{
protected:
    void play(Player *player);
};

/**
 * @brief 熟练级
 *
 */
class SecondaryLevel : public AbstractLevel
{
protected:
    void play(Player *player);
    void doubleScore(Player *player);
};

/**
 * @brief 专业级
 *
 */
class ProfessionalLevel : public AbstractLevel
{
protected:
    void play(Player *player);
    void doubleScore(Player *player);
    void changeCards(Player *player);
};

/**
 * @brief 骨灰级
 *
 */
class FinalLevel : public AbstractLevel
{
protected:
    void play(Player *player);
    void doubleScore(Player *player);
    void changeCards(Player *player);
    void cardWriting(Player *player);
};